package com.evosoft.service;

import javax.persistence.EntityManager;

import com.evosoft.dao.DAOFactory;
//import com.evosoft.enumeration.RolEnum;
import com.evosoft.excepciones.CantCreateUpdate;
import com.evosoft.excepciones.ExistentAdmin;
import com.evosoft.excepciones.NotEntityFoundException;
import com.evosoft.model.Empresa;
import com.evosoft.model.Persona;
import java.util.ArrayList;
import java.util.List;

public class PersonaService {
	
	private static PersonaService instance;

    private PersonaService() {
    }

    public synchronized static PersonaService getInstance() {
        if (instance == null) {
            instance = new PersonaService();
        }

        return instance;
    }

    public  Persona obtenerPorUsuario(String usuario, EntityManager em) throws NotEntityFoundException {
		Persona persona = null;
		persona = DAOFactory.getInstance().getPersonaDAO().findByUsuario(usuario, em);
		return persona;
    }

    
    public Persona obtenerPorId(int id, EntityManager em) throws NotEntityFoundException {
           Persona persona = null;
	   persona = DAOFactory.getInstance().getPersonaDAO().findById(id, em);
	   return persona;
    }
    
    
    public List<Persona> obtenerPorEmpresa(Integer id, EntityManager em) throws NotEntityFoundException {
        List<Persona> personas = new ArrayList<Persona>();
        personas = DAOFactory.getInstance().getPersonaDAO().obtenerPersonasPorEmpresa(id.intValue(), em);
        return personas;
    }
    
    public List<Persona> obtenerPersonasPorRol(int id, EntityManager em) throws NotEntityFoundException {
        List<Persona> personas = new ArrayList<Persona>();
        personas = DAOFactory.getInstance().getPersonaDAO().obtenerPersonasPorRol(id, em);
        return personas;
    }
    
    public void crearPersona(Persona persona, Integer idPersonaSesion, EntityManager em) throws NotEntityFoundException, CantCreateUpdate, ExistentAdmin {

        Empresa empresa = persona.getEmpresa();
        if(empresa.getAdmin_id() !=  0 && persona.getRol().getId() == 1) {
            throw (new ExistentAdmin());
        }
        if(idPersonaSesion !=  null) {
            Persona admin = DAOFactory.getInstance().getPersonaDAO().findById(idPersonaSesion, em);
            if(admin.getRol().getCreaUsuario() == true) {
                    DAOFactory.getInstance().getPersonaDAO().create(persona, em);
                    if(persona.getRol().getId() == 1) {
                        int idNuevaPersona = ServiceFactory.getInstance().getPersonaService().obtenerPorUsuario(persona.getUsuario(), em).getId();
                        empresa.setAdmin_id(idNuevaPersona);
                        DAOFactory.getInstance().getEmpresaDAO().update(empresa, em);
                    }
            }
            else {
                throw (new CantCreateUpdate());
            }
        }
        else {
            throw (new CantCreateUpdate());
        }
             
    }

    

    public void actualizarPersona(Persona persona, Integer id, EntityManager em) throws NotEntityFoundException, CantCreateUpdate, ExistentAdmin {
        Empresa empresa = persona.getEmpresa();
        if(id !=  null) {
            Persona admin = DAOFactory.getInstance().getPersonaDAO().findById(id, em);
            if(admin.getRol().getCreaUsuario() == true) {
                DAOFactory.getInstance().getPersonaDAO().update(persona, em);
            }
            else {
                throw (new CantCreateUpdate());
            }
        }
        else {
            throw (new CantCreateUpdate());
        }
    }
    
    public void eliminarPersona(Persona persona, Integer id, EntityManager em) throws CantCreateUpdate, NotEntityFoundException { 
         if(id !=  null) {
            Persona admin = DAOFactory.getInstance().getPersonaDAO().findById(id, em);
            if(admin.getRol().getId() == 1 || (admin.getRol().getId() == 2 && persona.getRol().getId() > 2)) {
                Persona p = em.merge(persona);
                DAOFactory.getInstance().getPersonaDAO().delete(p, em);                   
            }
            else {
                throw (new CantCreateUpdate());
            }
        }
        else {
            throw (new CantCreateUpdate());
        }
    }

    public List<Persona> obtenerPersonasDeAdmin(int id, EntityManager em) throws NotEntityFoundException {

        Persona admin = ServiceFactory.getInstance().getPersonaService().obtenerPorId(id, em);
        Empresa empresaAdmin = admin.getEmpresa();
        List<Empresa> empresasDependientes = ServiceFactory.getInstance().getEmpresaService().obtenerEmpresasDependientes(empresaAdmin.getId(), em);
        empresasDependientes.add(empresaAdmin);
        List<Persona> personas = new ArrayList<Persona>();
        for(Empresa e : empresasDependientes) {
            List<Persona> personasPorEmpresa = ServiceFactory.getInstance().getPersonaService().obtenerPorEmpresa(e.getId(), em);
            for(Persona p : personasPorEmpresa) {
               //Para no agregarse a la lista el mismo usuario 
               if(admin.getId() != p.getId()) 
                   personas.add(p);
            }
        }
        return personas;
    }

}
	